/* Filename: glob.c
 * Description: 用通配符查找文件并打印出来
 * Last modified: humble 20200308 22:35
 */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <glob.h>
#include <string.h>

#define PAT "/etc/a*.conf"
//#define PAT "/etc/*"  //不包括隐藏文件
//#define PAT "/etc/.*" //只匹配隐藏文件  //ls -a是列出非隐藏+隐藏文件

static void usage(void);
static int errfunc_(const char *epath, int eerrno) {
    fprintf(stderr, "Error: %s: %s\n", epath, strerror(eerrno));
    return 0;
}

int main(int argc, char **argv) {
    if(argc != 1){ fprintf(stderr, "argc !=1"); usage(); exit(1); }

    // int glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob);
    // pattern:通配符
    // flags:<GLOB_NOSORT：不对匹配结果进行排序; GLOB_APPEND：将匹配结果追加到pglob结构体中已有的结果后面>
    // errfunc:出错时打印的函数
    // pglob: 用于存储匹配结果
    // 返回0:成功；GLOB_NOMATCH:表示没有找到匹配的文件，其他非零值:表示出现了错误
    glob_t pglob;
    int ret = glob(PAT, 0, errfunc_, &pglob); // 查找匹配通配符PAT的文件，把结果保存在pglob里
    if(ret){ printf("errcode=%d\n", ret); exit(1); }

    for(size_t i = 0; i < pglob.gl_pathc; i++) {
    // for(size_t i = 0; i < pglob.gl_pathv[i] != NULL; i++) {
        puts(pglob.gl_pathv[i]);
    }
    globfree(&pglob); // 释放 glob 函数分配的内存
    return 0;
}

static void usage(void) {
#define USAGE "Usage:\n\
  Helloworld\n"
    printf(USAGE);
}
